/***************************************************
 @Name :        小铭同学
 @Time :        2025-09-03
 @Email :       LiaoMingWJ233@163.com
 @Comment :     音乐播放器
 @FileName :    widget.cpp
 @Version :     1.0
****************************************************/


#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    ui->exit->raise();
    PushButton_music(ui->exit);
    
    ui->label_bj->setPixmap(QPixmap(":/主题背景"));
        
    ui->label_zt->setText("音乐播放器");
    ui->label_zt->setStyleSheet("QLabel {"
        "    font-size: 50px;"           // 字体大小
        "    color: #1837ae;"            // 文字颜色
        "    font-weight: bold;"         // 字体粗细
        "    font-family: '楷体';"        // 字体家族
        "}"
    );
    
    ui->label_gj1->setPixmap(QPixmap(":/听音乐"));
    ui->label_gj2->setPixmap(QPixmap(":/吉他"));
    
    
    // 音乐播放
    // 字体设置
    // 歌名
    ui->label_music_singer->setFont(QFont("楷体", 20));
    
    // 使用样式表设置渐变颜色
    ui->label_music_singer->setStyleSheet(
                "QLabel {"
                "   color: #E0115F;"
                "   background-color: transparent;"
                "}"
    );
    
    // 歌手
    ui->label_music_song_name->setFont(QFont("楷体", 20));
    
    // 使用样式表设置渐变颜色
    ui->label_music_song_name->setStyleSheet(
                "QLabel {"
                "   color: #E0115F;"
                "   background-color: transparent;"
                "}"
    );
    
    // 歌词
    ui->label_music_lyric->setFont(QFont("楷体", 20));
    
    // 使用样式表设置渐变颜色
    ui->label_music_lyric->setStyleSheet(
                "QLabel {"
                "   color: #E0115F;"
                "   background-color: transparent;"
                "}"
    );
    
    // 初始化定时器
    timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &Widget::RegularExpression);
    timer->start(1000);  // 1000ms = 1秒触发一次
    
    // 设置 GIF 循环播放
    movie->setCacheMode(QMovie::CacheAll); // 缓存所有帧，提高性能
    movie->setSpeed(100); // 播放速度百分比（100 是正常速度）
    
    ui->label_music->setMovie(movie);//widget_music    
    // 创建圆角遮罩
    QPixmap maskPixmap(ui->label_music->size());
    maskPixmap.fill(Qt::transparent);
    
    QPainter painter(&maskPixmap);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(Qt::black);
    painter.setPen(Qt::NoPen);
    painter.drawRoundedRect(maskPixmap.rect(), 20, 20);
    
    ui->label_music->setMask(maskPixmap.mask());
    
    // 音乐
    // 监听播放状态变化
    connect(player, &QMediaPlayer::stateChanged, this, [this](QMediaPlayer::State state) {
        if(state==QMediaPlayer::StoppedState)//  播放器已停止（未播放）
        {
            movie->stop();// 停止播放
            ui->horizontalSlider_music->setValue(0);// 更新滑块位置
        }        
        //qDebug() << "播放状态变化：" << state;
    });
    
    // 设置滑块的范围
    connect(player, &QMediaPlayer::durationChanged, this, [this](qint64 duration) {
        ui->horizontalSlider_music->setRange(0, duration);
        ui->horizontalSlider_music->setSingleStep(duration / 100);  // 可选：设置步长
        ui->horizontalSlider_music->setPageStep(duration / 10);    // 可选：设置页步长
        //qDebug() << "duration:" << duration;           
    });
    
    // 播放进度
    connect(player, &QMediaPlayer::positionChanged, this, [this](qint64 pos){
        //qDebug() << "当前播放进度ms：" << pos;
        int content = pos;
        content_pos = content / 1000;  // ms 转 秒
        //qDebug() << "当前播放进度s：" << content_pos;
        ui->horizontalSlider_music->setValue(pos);// 更新滑块位置
    });
        
    ui->horizontalSlider_music->setStyleSheet(
        // 滑块容器设置
        "QSlider {"
        "    min-width: 814px;"
        "    max-width: 814px;"
        "    min-height: 12px;"  // 容器最小高度
        "}"
        
        // 轨道样式（极细3px）- 主背景层
        "QSlider::groove:horizontal {"
        "    border: 1px solid #d9d9d9;"
        "    background: white;"
        "    height: 3px;"
        "    border-radius: 1.5px;"
        "    margin: 4px 0;"
        "}"
        
        // 进度条（蓝紫渐变）- 严格匹配轨道尺寸
        "QSlider::sub-page:horizontal {"
        "    background: qlineargradient(x1:0, y1:0, x2:1, y2:0,"
        "                               stop:0 #8a2be2, stop:1 #00d4ff);"  // 紫到荧光蓝
        "    height: 3px;"       // 严格匹配轨道高度
        "    margin-top: 4px;"   // 与轨道margin同步
        "    margin-bottom: 4px;"
        "    border-radius: 1.5px;"
        "}"
        
        // 未滑过部分（透明且不干扰布局）
        "QSlider::add-page:horizontal {"
        "    background: transparent;"
        "    height: 0px;"       // 避免产生额外空间
        "    margin: 0;"
        "}"
        
        // 手柄（8px圆形，精确垂直居中）
        "QSlider::handle:horizontal {"
        "    background: qlineargradient(x1:0, y1:0, x2:1, y2:1,"
        "                               stop:0 #2ecc71, stop:1 #27ae60);"
        "    border: 1px solid #27ae60;"
        "    width: 8px;"
        "    height: 8px;"
        "    margin: -3px 0;"    // 计算公式：(3+4+4-8)/2 = -3
        "    border-radius: 4px;"
        "}"
        
        // 悬停状态（手柄轻微放大）
        "QSlider::handle:horizontal:hover {"
        "    background: qlineargradient(x1:0, y1:0, x2:1, y2:1,"
        "                               stop:0 #5efc82, stop:1 #2ecc71);"
        "    width: 10px;"
        "    height: 10px;"
        "    margin: -4px 0;"     // 重新计算居中：(3+4+4-10)/2 = -4
        "}"
    );
    
    // 按钮图标
    ui->pushButton_music_tp_1->setIcon(QIcon(":/音乐列表"));// 音乐音箱
    ui->pushButton_music_tp_1->setText("");
    ui->pushButton_music_tp_1->setIconSize(QSize(75, 50));
    ui->pushButton_music_tp_1->setFlat(true);  // 移除默认背景（可选，但可能影响 hover 效果）
    ui->pushButton_music_tp_1->setStyleSheet(
        "QPushButton {"
        "   background: transparent;"
        "   border: none;"
        "}"
        "QPushButton:hover {"
        "   background: rgba(200, 200, 200, 50);"  // 悬停效果
        "}"
    );
    
    ui->pushButton_music_tp_2->setIcon(QIcon(":/音乐下一首_关"));// 音乐下一首
    ui->pushButton_music_tp_2->setText("");
    ui->pushButton_music_tp_2->setIconSize(QSize(75, 50));
    ui->pushButton_music_tp_2->setFlat(true);  // 移除默认背景（可选，但可能影响 hover 效果）
    ui->pushButton_music_tp_2->setStyleSheet(
        "QPushButton {"
        "   background: transparent;"
        "   border: none;"
        "}"
        "QPushButton:hover {"
        "   background: rgba(200, 200, 200, 50);"  // 悬停效果
        "}"
    );
    
    ui->pushButton_music_tp_3->setIcon(QIcon(":/音乐播放_关"));// 音乐播放
    ui->pushButton_music_tp_3->setText("");
    ui->pushButton_music_tp_3->setIconSize(QSize(75, 50));
    ui->pushButton_music_tp_3->setFlat(true);  // 移除默认背景（可选，但可能影响 hover 效果）
    ui->pushButton_music_tp_3->setStyleSheet(
        "QPushButton {"
        "   background: transparent;"
        "   border: none;"
        "}"
        "QPushButton:hover {"
        "   background: rgba(200, 200, 200, 50);"  // 悬停效果
        "}"
    );
    
    ui->pushButton_music_tp_4->setIcon(QIcon(":/音乐上一首_关"));// 音乐上一首
    ui->pushButton_music_tp_4->setText("");
    ui->pushButton_music_tp_4->setIconSize(QSize(75, 50));
    ui->pushButton_music_tp_4->setFlat(true);  // 移除默认背景（可选，但可能影响 hover 效果）
    ui->pushButton_music_tp_4->setStyleSheet(
        "QPushButton {"
        "   background: transparent;"
        "   border: none;"
        "}"
        "QPushButton:hover {"
        "   background: rgba(200, 200, 200, 50);"  // 悬停效果
        "}"
    );
    
    
}

Widget::~Widget()
{
    delete ui;
}

void Widget::PushButton_music(QPushButton* PushButton)
{
    PushButton->setStyleSheet(R"(
        QPushButton {
            background-color: #d0dba8;
            color: white;
            border-radius: 15px;
            border: none;
            padding: 4px 4px;
            font-size: 20px;
            font-weight: bold;
            font-family: "楷体";
        }
        QPushButton:hover {
            background-color: #3367d6;
        }
        QPushButton:pressed {
            background-color: #2a56c6;
        }
    )");
}

void Widget::RegularExpression()
{
    // 定义正则表达式：匹配 "数字+ms" 后的内容，直到换行符
    QRegularExpression regex(R"((\d+)ms\s([^\n]+))");
    QRegularExpressionMatchIterator it = regex.globalMatch(content);
    
    // 存储所有匹配到的歌词
    QVector<QPair<int, QString>> lyrics;
    while (it.hasNext()) {
        QRegularExpressionMatch match = it.next();
        int ms = match.captured(1).toInt();
        int seconds = ms / 1000;  // ms 转 秒
        QString lyric = match.captured(2);
        lyrics.append(qMakePair(seconds, lyric));
    }
    
    if (lyrics.isEmpty()) {
        return;
    }
    
    // 查找当前时间点对应的歌词索引
    int currentIndex = -1;
    for (int i = 0; i < lyrics.size(); ++i) {
        if (content_pos >= lyrics[i].first) {
            currentIndex = i;
        } else {
            break;
        }
    }
    
    // 如果没有找到匹配的歌词，或者当前时间在第一句歌词之前
    if (currentIndex == -1) {
        ui->label_music_lyric->setText("");
        return;
    }
    
    // 计算要显示的歌词范围（确保当前歌词在第4行，总共显示7句）
    int startIndex = qMax(0, currentIndex - 3);  // 当前歌词前3句
    int endIndex = qMin(lyrics.size() - 1, startIndex + 6); // 总共显示7句
    
    // 如果末尾空间不足，调整起始位置
    if (endIndex - startIndex < 6) {
        startIndex = qMax(0, endIndex - 6);
    }
    
    // 构建显示文本
    QString displayText;
    for (int i = startIndex; i <= endIndex; ++i) {
        if (i == currentIndex) {
            // 当前播放的歌词加粗或高亮显示
            displayText += "<b>" + lyrics[i].second + "</b><br>";
        } else {
            displayText += lyrics[i].second + "<br>";
        }
    }
    
    ui->label_music_lyric->setText(displayText);
}

void Widget::gc_list()
{
    QString fileName;
    switch (num) {
    case 1:
        fileName = fileName1;
        break;
    case 2:
        fileName = fileName2;
        break;
    }
    
    // 歌喜欢你-邓紫棋    
    //qDebug() << fileName <<endl;
    if (!fileName.isEmpty()) {
        //qDebug() << "尝试打开文件:" << fileName;
        
        // 读取文件
        QFile file(fileName);
        if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {  // 改为只读模式
            QTextStream in(&file);
            in.setCodec("UTF-8");  // 设置编码为UTF-8，防止中文乱码
            content = in.readAll();  // 读取全部内容
            
            //qDebug() << "文件内容:" << content;
            //qDebug() << "文件大小:" << content.length() << "字符";
            
            // 查找"歌"关键字并提取后面的内容
            int songIndex = content.indexOf("歌");
            //qDebug() << "\"歌\"的位置:" << songIndex;
            
            if (songIndex != -1) {
                // 从"歌"后面开始查找，直到换行符或文件末尾
                int startPos = songIndex + 1; // "歌"字后面
                int endPos = content.indexOf("\n", startPos);
                if (endPos == -1) endPos = content.length();
                
                // 提取歌曲信息字符串
                QString songInfo = content.mid(startPos, endPos - startPos).trimmed();
                //qDebug() << "提取的歌曲信息:" << songInfo;
                
                // 分割文件名
                QStringList parts = songInfo.split('-');
                //qDebug() << "分割结果:" << parts;
                
                // 打印分割后的部分
                if (parts.size() >= 2) {
                    ui->label_music_song_name->setText(parts[0].trimmed());  // 歌曲名
                    ui->label_music_singer->setText(parts[1].trimmed());     // 歌手名
                } else if (parts.size() == 1) {
                    // 如果没有分隔符，只显示歌曲名
                    ui->label_music_song_name->setText(parts[0].trimmed());
                    ui->label_music_singer->setText("未知歌手");
                }
            } else {
                qDebug() << "未找到\"歌\"关键字";
            }
            
            file.close();
        } else {
            qDebug() << "文件打开失败，错误:" << file.errorString();
            qDebug() << "文件路径是否存在:" << QFileInfo(fileName).exists();
        }
    }
        
    
}

void Widget::on_exit_clicked()
{
    this->close();
    QApplication::quit();
}

void Widget::on_pushButton_music_tp_1_clicked()
{
    // 创建音乐列表对话框
    QDialog *musicDialog = new QDialog(this);
    musicDialog->setWindowTitle("音乐列表");
    musicDialog->setFixedSize(300, 200);
    musicDialog->setWindowIcon(QIcon(":/音乐音箱"));
    
    // 创建布局
    QVBoxLayout *layout = new QVBoxLayout(musicDialog);
    
    // 创建音乐列表
    QStringList musicList;
    musicList << "中国人民解放军军歌-解放军合唱团"
              << "我们是光荣的武警部队-武警部队合唱团";
    
    // 创建列表控件
    QListWidget *listWidget = new QListWidget(musicDialog);
    listWidget->addItems(musicList);
    
    // 连接列表项点击信号
    connect(listWidget, &QListWidget::itemClicked, [this, musicDialog](QListWidgetItem *item) {
        QString musicName = item->text();
        
        // 根据音乐名称映射到对应的歌曲
        if (musicName == "中国人民解放军军歌-解放军合唱团") {
            num = 1;
            player->setMedia(QUrl(str1));
        } else if (musicName == "我们是光荣的武警部队-武警部队合唱团") {
            num = 2;
            player->setMedia(QUrl(str2));
        }
        
        // 更新歌曲信息
        gc_list();
        
        // 自动开始播放
        if (player->state() != QMediaPlayer::PlayingState) {
            ui->pushButton_music_tp_3->setIcon(QIcon(":/音乐播放_开"));
            ui->pushButton_music_tp_2->setIcon(QIcon(":/音乐下一首_开"));// 音乐播放下一首
            ui->pushButton_music_tp_4->setIcon(QIcon(":/音乐上一首_开"));// 音乐播放上一首
            movie->start();
            player->play();
            player->setVolume(100);
        }
        
        // 点击歌曲后自动关闭对话框
        musicDialog->accept();
    });
    
    // 添加到布局
    layout->addWidget(listWidget);
    
    // 显示对话框（模态对话框）
    musicDialog->exec();
    
    // 清理内存
    musicDialog->deleteLater();
}

void Widget::on_pushButton_music_tp_2_clicked()
{
    ui->pushButton_music_tp_2->setIcon(QIcon(":/音乐下一首_开"));// 音乐播放下一首
    ui->pushButton_music_tp_4->setIcon(QIcon(":/音乐上一首_关"));// 音乐播放上一首
    if(num>=3){
        num=1;
    }else num+=1;
    gc_list();
    
    switch (num) {
    case 1:
        player->setMedia(QUrl(str1));
        break;
    case 2:
        player->setMedia(QUrl(str2));
        break;
    }
}

int i=0;
void Widget::on_pushButton_music_tp_3_clicked()
{
    i++;
         
    if(player->state()==QMediaPlayer::PlayingState)//  正在播放
    {
        i=2;
    }   
    else if(player->state()==QMediaPlayer::StoppedState)//  播放器已停止（未播放）
    {
        i=1;
    }
    
    if(i==1)
    {
        if(player->state()==QMediaPlayer::StoppedState)//  播放器已停止（未播放）
        {
            ui->pushButton_music_tp_4->setIcon(QIcon(":/音乐上一首_开"));// 音乐播放上一首
            ui->pushButton_music_tp_2->setIcon(QIcon(":/音乐下一首_开"));// 音乐播放下一首
            
            ui->pushButton_music_tp_3->setIcon(QIcon(":/音乐播放_开"));// 音乐播放
            
            movie->start(); // GIF开始播放                                                       
            
            player->play(); // 音乐开始播放​            
              
            player->setVolume(100); // 设置音量​
            
            // 获取播放进度的正确位置
            //qDebug() << "初始播放进度：" << player->position();
            //qDebug() << "播放状态1：" << player->state();                       
        }        
    }    
    else if(i==2)
    {
        if(player->state()==QMediaPlayer::PlayingState) // 正在播放
        {
            ui->pushButton_music_tp_4->setIcon(QIcon(":/音乐上一首_开"));// 音乐播放上一首
            ui->pushButton_music_tp_2->setIcon(QIcon(":/音乐下一首_开"));// 音乐播放下一首
            //movie->stop();// 停止播放
            movie->setPaused(true);  // 暂停动画
            ui->pushButton_music_tp_3->setIcon(QIcon(":/音乐播放_关")); // 暂停音乐播放
            
            player->pause();  // 暂停播放
            // 获取暂停时的播放进度
            //qDebug() << "暂停时进度：" << player->position();
            //qDebug() << "播放状态2：" << player->state();           
        }
    }    
    else if(i==3)
    {
        if(player->state()==QMediaPlayer::PausedState)//  已暂停
        {
            ui->pushButton_music_tp_4->setIcon(QIcon(":/音乐上一首_开"));// 音乐播放上一首
            ui->pushButton_music_tp_2->setIcon(QIcon(":/音乐下一首_开"));// 音乐播放下一首
            
            ui->pushButton_music_tp_3->setIcon(QIcon(":/音乐播放_开"));// 音乐播放
            
            movie->setPaused(false); // 恢复播放
                        
            player->setPosition(player->position()); // 暂停位置播放
            
            player->play(); // 音乐开始播放
            //qDebug() << "暂停时进度：" << player->position();
            //qDebug() << "播放状态3：" << player->state();            
        }
        i=0;
    }
}

void Widget::on_pushButton_music_tp_4_clicked()
{
    ui->pushButton_music_tp_4->setIcon(QIcon(":/音乐上一首_开"));// 音乐播放上一首
    ui->pushButton_music_tp_2->setIcon(QIcon(":/音乐下一首_关"));// 音乐播放下一首
    if(num<=0){
        num=2;
    }else num -= 1;
    gc_list();
    
    switch (num) {
    case 1:        
        player->setMedia(QUrl(str1));
        break;
    case 2:
        player->setMedia(QUrl(str2));
        break;
    }
}
